#include "filterbank.h"
#include "mediaitem.h"
#include <QDir>

FilterBank::FilterBank(PioCore & core, QObject *parent) :
    QObject(parent),
    m_core(core),
    m_type(PioCore::RawAndOther)
{
}

bool FilterBank::pass(MediaItemPtr item)
{
    if(m_type == PioCore::Raw && !item->metadata().isRaw)
        return false;
    else if(m_type == PioCore::Other && item->metadata().isRaw)
        return false;
    else if(m_type == PioCore::UnprocessedRaw) {
        QSet<MediaItemPtr> set = m_core.set(item);
        if(!item->metadata().isRaw || set.size() > 1)
            return false;
    }
    else if(m_type == PioCore::UnprocessedRawAndOther) {
        QSet<MediaItemPtr> set = m_core.set(item);
        if(item->metadata().isRaw && set.size() > 1)
            return false;
    }
    if(m_excludedCollections.contains(item->metadata().collection))
        return false;
    return true;
}

void FilterBank::setExcludedCollections(const QSet<QString> & categories)
{
    m_excludedCollections = categories;
    update();
}

QSet<QString> FilterBank::excludedCollections()
{
    return m_excludedCollections;
}

QSet<MediaItemPtr> FilterBank::view()
{
    return m_in;
}

void FilterBank::onAdded(MediaItemPtr item)
{
    if(pass(item)) {
        m_in.insert(item);
        emit added(item);
    }
    else
        m_out.insert(item);
}

void FilterBank::onRemoved(MediaItemPtr item)
{
    if(pass(item)) {
        m_in.remove(item);
        emit removed(item);
    }
    else
        m_out.remove(item);
}

void FilterBank::onUpdated(MediaItemPtr item)
{
    if(pass(item)) {
        if(m_in.contains(item))
            emit updated(item);
        else {
            m_out.remove(item);
            m_in.insert(item);
            emit added(item);
        }
    }
    else {
        if(m_in.contains(item)) {
            m_in.remove(item);
            m_out.insert(item);
            emit removed(item);
        }
    }
}

void FilterBank::setRawType(PioCore::RawType type)
{
    m_type = type;
    update();
}

void FilterBank::update()
{
    QMutableSetIterator<MediaItemPtr> it1(m_in);
    while(it1.hasNext()) {
        MediaItemPtr item = it1.next();
        if(!pass(item)) {
            it1.remove();
            m_out.insert(item);
            emit removed(item);
        }
    }

    QMutableSetIterator<MediaItemPtr> it2(m_out);
    while(it2.hasNext()) {
        MediaItemPtr item = it2.next();
        if(pass(item)) {
            it2.remove();
            m_in.insert(item);
            emit added(item);
        }
    }
}
